package pe.gob.foncodes.ssa.web.controller;

import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;

import pe.gob.foncodes.ssa.bs.common.controller.GenericController;
import pe.gob.foncodes.ssa.bs.common.util.ServiceException;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Conexion;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Perfil;
import pe.gob.foncodes.ssa.web.beans.ConexionPorUsuarioBean;
import pe.gob.foncodes.ssa.web.beans.UsuarioBean;
import pe.gob.foncodes.ssa.web.util.Impresion;

public class ReporteConexionesPorUsuariosController extends GenericController {
    protected static Logger log = Logger.getLogger(ReporteConexionesPorUsuariosController.class);
    
    private String busCodUsuario;
    private String busNomUsuario;
    
    private UsuarioBean selectedUsuario;
    private List<UsuarioBean> lstUsuarios;
    
    private Long busPerfil;
    private Long busConexion;
    
    private List<Perfil> lstPerfil;    
    private List<Conexion> lstConexion;
    private List<ConexionPorUsuarioBean> lstConexiones;
    
    @Override
    public void init(){
        lstConexiones = new ArrayList<ConexionPorUsuarioBean>();
    }

    @Override
    public void search(ActionEvent event) throws Exception{
        log.info("Ejecutando filtro reporte");
        Long idUsuario = null;
        if(this.selectedUsuario!= null){
            idUsuario  = this.selectedUsuario.getId();
        }
        List<Object[]> olstConexiones = null;
        if (this.busPerfil==null || this.busPerfil==0){
            this.busPerfil =null;
        }
        if (this.busConexion==null || this.busConexion==0){
            this.busConexion=null;
        }
        olstConexiones = getService().findByNamedQuery("Conexion.findByReporte",
                                                                            new Object[]{idUsuario
                                                                                       , this.busPerfil
                                                                                       , this.busConexion});
        
        
        this.lstConexiones = new ArrayList<ConexionPorUsuarioBean>();
        for(Object[] obj: olstConexiones){
            ConexionPorUsuarioBean oConexion = new ConexionPorUsuarioBean();
            oConexion.setCOD_USUARIO((String)obj[0]);
            oConexion.setNOMBRES((String)obj[1]);
            oConexion.setTXT_MODULO((String)obj[2]);
            oConexion.setTXT_PERFIL((String)obj[3]);
            oConexion.setTXT_CONEXION((String)obj[4]);
            oConexion.setTIPO_USUARIO((String)obj[5]);
            
            this.lstConexiones.add(oConexion);
        }        
    }
    
    public void limpiar(){
        this.selectedUsuario = null;
        this.busConexion = null;
        this.busPerfil = null;        
        this.lstConexiones = new ArrayList<ConexionPorUsuarioBean>();        
    }
    
    public void print() {
        try {
            Collection col = new ArrayList();
            for (ConexionPorUsuarioBean oConexion : this.lstConexiones) {
                col.add(oConexion);
            }
            Impresion imprimir = new Impresion();
            imprimir.imprimirListado("ssa_rpt_conexiones_x_usuario", col);
        } catch (Exception ex) {
            log.error(ex);
        } finally {
            FacesContext.getCurrentInstance().responseComplete();
        }
    }
    
//    
//    @Override
//    public boolean validate() throws Exception{
//        boolean success = true;
//        
//        return success;
//    }

    public String getBusCodUsuario() {
        return busCodUsuario;
    }

    public void setBusCodUsuario(String busCodUsuario) {
        this.busCodUsuario = busCodUsuario;
    }

    public String getBusNomUsuario() {
        return busNomUsuario;
    }

    public void setBusNomUsuario(String busNomUsuario) {
        this.busNomUsuario = busNomUsuario;
    }

    public List<Conexion> getLstConexion() throws ServiceException {
        this.lstConexion = getService().findByNamedQuery("Conexion.findAll");
        return lstConexion;
    }

    public void setLstConexion(List<Conexion> lstConexion) {
        this.lstConexion = lstConexion;
    }

    public List<Perfil> getLstPerfil() throws ServiceException {
        return lstPerfil;
    }

    public void setLstPerfil(List<Perfil> lstPerfil) {
        this.lstPerfil = lstPerfil;
    }

    public Long getBusConexion() {
        return busConexion;
    }

    public void setBusConexion(Long busConexion) {
        this.busConexion = busConexion;
    }

    public Long getBusPerfil() {
        return busPerfil;
    }

    public void setBusPerfil(Long busPerfil) {
        this.busPerfil = busPerfil;
    }

    public List<ConexionPorUsuarioBean> getLstConexiones() {
        return lstConexiones;
    }

    public void setLstConexiones(List<ConexionPorUsuarioBean> lstConexiones) {
        this.lstConexiones = lstConexiones;
    }    
    
    public void limpiarBusquedaUsuario() throws Exception {
        this.busCodUsuario = "";
        this.busNomUsuario ="";
        lstUsuarios = new ArrayList<UsuarioBean>();
    }

    public UsuarioBean getSelectedUsuario() {
        return selectedUsuario;
    }

    public void setSelectedUsuario(UsuarioBean selectedUsuario) {
        this.selectedUsuario = selectedUsuario;
    }

    public List<UsuarioBean> getLstUsuarios() {
        return lstUsuarios;
    }

    public void setLstUsuarios(List<UsuarioBean> lstUsuarios) {
        this.lstUsuarios = lstUsuarios;
    }
    
    public void searchUsuario() throws ServiceException{
        this.busCodUsuario=(this.busCodUsuario == null)?null:this.busCodUsuario.trim().toUpperCase();
        this.busNomUsuario=(this.busNomUsuario == null)?null:this.busNomUsuario.trim().toUpperCase();
        
        String strNomUsuario = (this.busNomUsuario == null) ? null : "%" + this.busNomUsuario + "%";
        String strCodUsuario = (this.busCodUsuario == null) ? null : "%" + this.busCodUsuario + "%";
                
        List<Object[]> olstUsuarios = getService().findByNamedQuery("Usuario.findByCodUsuarioNombre", new Object[]{strCodUsuario, strNomUsuario});    
        this.lstUsuarios = new ArrayList<UsuarioBean>();
        for(Object[] obj: olstUsuarios){
            UsuarioBean oUsuario = new UsuarioBean();
            oUsuario.setCOD_USUARIO((String)obj[0]);
            oUsuario.setTXT_TIPO_USUARIO((String)obj[1]);
            oUsuario.setTXT_APELLIDOS_NOMBRES((String)obj[2]);
            oUsuario.setId((Long) obj[3]);
            this.lstUsuarios.add(oUsuario);
        }      
    }
    
    public void actualizarUsuarioSeleccion(UsuarioBean us) throws ServiceException{
        this.selectedUsuario = us;
        if (this.selectedUsuario == null) {
            log.info("El Usuario seleccionado es null");
            this.lstPerfil = null;
        }else{
            this.lstPerfil = getService().findByNamedQuery("Perfil.findByNidUsuario",new Object[]{this.selectedUsuario.getId()});        
        }
    }
    
    public void limpiarConexion(){
        if (this.busPerfil != null) {
            this.busConexion = null;
        }
    }

}
